package com.bdqn.mapper;

import com.bdqn.pojo.Storage;
import com.bdqn.pojo.Supplier;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 入库记录接口
 * ch02 实战1 实现查询入库记录表的功能
 */
public interface StorageMapper {


    /**
     * 查询查询入库记录的总记录数
     * @param goodsName 商品名称
     * @param supplierId 供货商ID
     * @param payStatus 支付状态
     * @return
     */
    int count(@Param("goodsName") String goodsName ,@Param("supplierId") Integer supplierId,@Param("payStatus") Integer payStatus);


    /**
     * 分页查询查询入库记录
     * @param goodsName 商品名称
     * @param supplierId 供货商ID
     * @param payStatus 支付状态
     * @param pageIndex
     * @param pageSize
     * @return
     */
    List<Storage> selectStoragePageBeginLimitList(@Param("goodsName") String goodsName ,@Param("supplierId") Integer supplierId,@Param("payStatus") Integer payStatus,@Param("pageIndex") Integer pageIndex, @Param("pageSize")Integer pageSize);


    /**
     * 根据 id查询供货商表
     * @param id
     * @return
     */
    List<Supplier> selectSupplierList(@Param("id")Integer id);


    /**
     *  根据 id查询入库记录
     * @param
     * @return
     */
    Storage selectStoragesById(@Param("id")Integer id);


    /**
     *  添加入库记录
     * @param storage
     * @return
     */
    boolean add(Storage storage);


    /**
     * 入库记录修改
     * @param storage
     * @return
     */
    boolean update(Storage storage);











    /**
     *  ① 使用 @Param 注解的方式 根据 商品名称、供货商ID、支付状态 三个条件查询入库记录
     * @param goodsName 商品名称
     * @param supplierId 供货商ID
     * @param payStatus 支付状态
     * @return storageList
     */
    public List<Storage> selectStoragesParamList(@Param("goodsName")String goodsName , @Param("supplierId")Integer supplierId, @Param("payStatus")Integer payStatus );


    /**
     *  ② 使用 将查询条件 封装成 Java 对象作为入参 的方式 根据 商品名称、供货商ID、支付状态 三个条件查询入库记录
     *
     * @param storage
     * @return storageJavaList
     */
    public List<Storage> selectStoragesJavaList(Storage storage);


    /**
     * ③ 使用 将查询条件 封装成 Map 对象作为入参 的方式 根据 商品名称、供货商ID、支付状态 三个条件查询入库记录
     * @param storageMap  storageMap对象
     * @return storageMapList
     */
    public List<Storage> selectStoragesMapList(Map<String , Object> storageMap);


    /**
     *  ch02 实战 2  在查询结果中加入供货商名称字段
     *  使用 将查询条件 封装成 Java 对象作为入参 的方式 根据 商品名称、供货商ID、支付状态 三个条件查询入库记录
     * @param storage storageMap对象
     * @return storageJavaList and supplierName
     */
    public List<Storage> selectStoragesAndSupplierNameList(Storage storage);


    /**
     *  ch02 实战 3  使用 association 查询入库记录表
     * @param storage storage 对象
     * @return  storageList
     */
    public List<Storage> selectStoragesAssociationList(Storage storage);

    /**
     *  ch02 实战 4  使用 collection 查询供货商及相关入库记录
     * @param supplierId 根据指定的供货商ID查询供货商信息与该供货商有关的所有入库记录
     * @return StoragesAndSupplierList
     */
    public List<Supplier> selectStoragesAndSupplierList(@Param("supplierId")Integer supplierId);

    /**
     *  ch03 实战1 使用if标签改造入库记录模块的列表查询功能
     * @param supplierId
     * @param payStatus
     * @param goodsName
     * @return
     */
    public List<Storage> selectStorageAndSupplerIFList(@Param("supplierId")Integer supplierId,@Param("payStatus")Integer payStatus,@Param("goodsName")String goodsName);

    /**
     * ch03 实战2 使用if-where 标签改造供货商模块的列表查询功能
     * @param supCode 供货商编码
     * @param supName 供货商名称
     * @return
     */
    public List<Supplier> selectSupplierSupCodeSupNameList(@Param("supCode")String supCode,@Param("supName")String supName);

    /**
     * ch03 实战3 使用 choose 标签改造供货商模块的列表查询功能
     * @param supCode 供货商编码
     * @param supName 供货商名称
     * @param supContact 联系人
     * @param createdTime 创建时间
     * @return supplierList
     */
    public List<Supplier> selectSupplierSupCodeSupNameSupContactCreatedTimeList(@Param("supCode")String supCode,@Param("supName")String supName,@Param("supContact")String supContact,@Param("createdTime")String createdTime);


    /**
     *  ch03 实战4 使用 数组为参数 实现列表查询功能
     * @param supplierId
     * @return
     */
    public List<Storage> selectStorageSupplierIdSupplierIdArrayList(Integer[] supplierId);

    /**
     *  ch03 实战4 使用 list集合 为参数 实现列表查询功能
     * @param storageLists
     * @return
     */
    public List<Storage> selectStorageSupplierIdSupplierIdList(List<Integer> storageLists);

    /**
     *  ch03 实战5 使用 Map对象 为参数 同时查询多个供货商关联的入库单列数据
     * @param stringObjectMap 入库记录编码
     * @return
     */
    public List<Storage> selectStorageInSupplierIdAndLikeSrCodeMapList(Map<String,Object> stringObjectMap);

}
